import { ChatOllama } from "@langchain/ollama";
import {
  ChatPromptTemplate,
  SystemMessagePromptTemplate,
  HumanMessagePromptTemplate,
} from "@langchain/core/prompts";
import { StringOutputParser } from "@langchain/core/output_parsers";
import { RunnableSequence } from "@langchain/core/runnables";

// 1. 模型
const model = new ChatOllama({
  model: "llama3",
  temperature: 0.1, // 因为是做摘要操作，不需要模型进行思维的发散，建议低温处理
});

// 2. 提示词 - 关键
const prompt = ChatPromptTemplate.fromMessages([
  SystemMessagePromptTemplate.fromTemplate(`
你是一个“滚动摘要维护器”。目标：在保留长期有用信息（偏好、设定、长期目标、阶段进展）的前提下，
将新的对话融合进“已有摘要”，去掉一次性细节与冗余，保持简洁、准确、一致。

必须遵守：
- 语言：**只输出简体中文**。
- 形式：**只输出最终摘要文本本身**，不要任何说明、前后缀、引号、Markdown、前言或结论。
- 长度：200~400字为宜（可根据输入增减，但请避免流水账）。
- 一致性：若新信息与旧摘要冲突，请以“最新信息为准”，并合并为一致表述。
- 去噪：人物寒暄、一次性验证码/问候、与长期无关的信息一律删除。
`),
  HumanMessagePromptTemplate.fromTemplate(`
【已有摘要】
{summary}

【新增对话】
{new_lines}

请输出“更新后的摘要”：
`),
]);

// 3. 轻度清洗，兜底去除潜在前后缀、空行
const stripNoise = (text) =>
  text
    // 常见多余标记清理（可按需扩展）
    .replace(/^(```\w*|```)+/g, "")
    .replace(/```$/g, "")
    .replace(/^(更新后的摘要[:：]\s*)/i, "")
    .trim();

// 4. 解析器
const parser = new StringOutputParser();

// 5. 构建摘要链
export const summaryChain = RunnableSequence.from([
  prompt,
  model,
  parser,
  (str) => stripNoise(str),
]);
